package com.hotelvip.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hotelvip.common.exception.ServiceException;
import com.hotelvip.common.utils.EnumUtil;
import com.hotelvip.common.utils.IdcardUtils;
import com.hotelvip.common.utils.NumberUtil;
import com.hotelvip.common.utils.ShiroUtils;
import com.hotelvip.dao.IdentityMapper;
import com.hotelvip.dao.SysUserMapper;
import com.hotelvip.dao.UserMapper;
import com.hotelvip.dao.VipUserMapper;
import com.hotelvip.entity.Identity;
import com.hotelvip.entity.User;
import com.hotelvip.enumEntity.*;
import com.hotelvip.service.FileService;
import com.hotelvip.service.UserService;
import com.hotelvip.vo.ImageVO;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ResourceUtils;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author Lzh
 * @date 2020/12/24 15:49
 */
@Service
@PropertySource("classpath:/config/image.properties")
public class FileServiceImpl implements FileService {

    @Value("${image.dirPath}")
    private String dirPath;
    @Value("${image.urlPath}")
    private String urlPath;


    /**
     * 为了防止Set集合每次都要创建,则通过static代码块的形式负责封装数据
     */
    private static Set<String> imageSet = new HashSet<>();
    private static Set<String> excelSet = new HashSet<>();

    static {
        imageSet.add(".jpg");
        imageSet.add(".jpeg");
        imageSet.add(".bmp");
        imageSet.add(".png");
        imageSet.add(".gif");
        imageSet.add(".pdf");
        imageSet.add(".docx");
        imageSet.add(".doc");
        excelSet.add(".xls");
        excelSet.add(".xlsx");
        //....
    }


    /**
     * 文件上传具体步骤:
     * 1.如何校验用户上传的是图片?    jpg|png
     * 2.如何访问用户上传恶意程序     木马.exe.jpg  宽度*高度
     * 3.应该采用分目录存储的方式     保存数据
     * 4.上传的文件名称应该尽量避免重名  自定义文件名称...  UUID.后缀...
     *
     * @param uploadFile
     * @return
     */
    @Override
    public ImageVO upload(MultipartFile uploadFile) {
//        //1.校验图片类型是否正确 jpg|png|gifxxxx  1.正则表达式判断  2.准备集合之后进行校验Set<去重>
//        //1.1 获取上传的图片类型 ABC.JPG
//        String fileName = uploadFile.getOriginalFilename();  //文件的全名 abc.jpg
//        fileName = fileName.toLowerCase();                   //将所有的字符转化为小写
//        int index = fileName.lastIndexOf(".");
//        String fileType = fileName.substring(index);  //含头不含尾
//        //1.2判断是否为图片类型    bug
//        if (!imageSet.contains(fileType)) {
//            //用户上传的不是图片
//            return ImageVO.fail();
//        }
//
//        //2.上传的数据是否为恶意程序. 高度和宽度是否为null. 利用图片API
//        //BufferedImage对象 专门负责封装图片
//        try {
//            BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
//            int width = bufferedImage.getWidth();
//            int height = bufferedImage.getHeight();
////            if(width==0 || height ==0){
////                return ImageVO.fail();
////            }
//
//            //3.采用分目录存储的方式  a.jpg
//            //3.1 分目录存储方式1 hash方式 ACBBCDD
//            //3.1 分目录存储方式2 时间方式存储 yyyy/MM/dd
//            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
//            //3.2 准备文件存储的目录
//            String imageDir = dirPath + dateDir;
//            File imageFileDir = new File(imageDir);
//            if (!imageFileDir.exists()) {
//                imageFileDir.mkdirs();
//            }
//
//            //4 实现文件上传
//            //4.1 动态拼接文件名称   uuid.后缀  f3aa1378-ece6-11ea-98c9-00d861eaf238
//            String uuid =
//                    UUID.randomUUID().toString().replace("-", "");
//            String realFileName = uuid + fileType;
//            //4.2 准备文件上传的全路径  磁盘路径地址+文件名称
//            File imageFile = new File(imageDir + realFileName);
//            //4.3 实现文件上传
//            uploadFile.transferTo(imageFile);
//
//            //5.动态生成URL地址
//            //请求协议: http://  https:// 带证书的网址 安全性更高 公钥私钥进行加密解密.
//            //向服务器运行商购买域名  com  cn  org   hosts文件
//            //图片存储的虚拟地址的路径 动态变化的路径
//            String url = urlPath + dateDir + realFileName;
//            return ImageVO.success(url, width, height);
//        } catch (IOException e) {
//            e.printStackTrace();
//            return ImageVO.fail();
//        }

        File genPath = null;
        try {
            genPath = new File(ResourceUtils.getURL("classpath:").getPath());
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            throw new ServiceException("获取文件路径失败 请联系管理员" + e.getMessage());
        }
        if (!genPath.exists()) {
            genPath = new File("");
        }
        //在开发测试模式时，得到地址为：{项目跟目录}/target/progress/
        //在打成jar正式发布时，得到的地址为:{发布jar包目录}/progress/
        File savePath = new File(genPath.getAbsolutePath(), "fileupload" + File.separator + dirPath);

        //1.校验图片类型是否正确 jpg|png|gifxxxx  1.正则表达式判断  2.准备集合之后进行校验Set<去重>
        //1.1 获取上传的图片类型 ABC.JPG
        String fileName = uploadFile.getOriginalFilename();  //文件的全名 abc.jpg
        fileName = fileName.toLowerCase();                   //将所有的字符转化为小写
        int index = fileName.lastIndexOf(".");
        String fileType = fileName.substring(index);  //含头不含尾

        //2.上传的数据是否为恶意程序. 高度和宽度是否为null. 利用图片API
        //BufferedImage对象 专门负责封装图片
        try {
            BufferedImage bufferedImage = ImageIO.read(uploadFile.getInputStream());
            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();
//            if(width==0 || height ==0){
//                return ImageVO.fail();
//            }

            //3.采用分目录存储的方式  a.jpg
            //3.1 分目录存储方式1 hash方式 ACBBCDD
            //3.1 分目录存储方式2 时间方式存储 yyyy/MM/dd
            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
            //3.2 准备文件存储的目录
            String imageDir = savePath.getParent() + File.separator + dirPath + dateDir;
            File fileDir = new File(imageDir);
            if (!fileDir.exists()) {
                fileDir.mkdirs();
            }

            //4 实现文件上传
            //4.1 动态拼接文件名称   uuid.后缀  f3aa1378-ece6-11ea-98c9-00d861eaf238
            String uuid =
                    UUID.randomUUID().toString().replace("-", "");
            String realFileName = uuid + fileType;
            //4.2 准备文件上传的全路径  磁盘路径地址+文件名称
            File imageFile = new File(imageDir + realFileName);
            //4.3 实现文件上传
            uploadFile.transferTo(imageFile);
            //5.动态生成URL地址
            //请求协议: http://  https:// 带证书的网址 安全性更高 公钥私钥进行加密解密.
            //向服务器运行商购买域名  com  cn  org   hosts文件
            //图片存储的虚拟地址的路径 动态变化的路径
            String url = urlPath + dateDir + realFileName;
            return ImageVO.success(url, width, height,imageFile.getPath());
        } catch (IOException e) {
            e.printStackTrace();
            return ImageVO.fail();
        }

    }


    @Autowired
    private UserMapper userMapper;
    @Autowired
    private IdentityMapper identityMapper;
    @Autowired
    private VipUserMapper vipUserMapper;
    @Autowired
    private SysUserMapper sysUserMapper;


    /**
     * 用户导出
     *
     * @param response
     * @throws IOException
     */
    @Override
    public void getUserExcel(HttpServletResponse response) throws IOException {
        //确定编码的格式
        response.setCharacterEncoding("UTF-8");
        //获取导出的数据
        List<User> users = userMapper.selectList(new QueryWrapper<User>().lambda().in(User::getDeleted, 0, 1).in(User::getVStatus, 0, 1));
        List<Identity> identities = identityMapper.selectList(null);
        //创建excel文件
        XSSFWorkbook wb = new XSSFWorkbook();
        //创建sheet页
        XSSFSheet sheet = wb.createSheet("客户用户信息");
        //创建标题行
        XSSFRow titleRow = sheet.createRow(0);
        titleRow.createCell(0).setCellValue("客户id");
        titleRow.createCell(1).setCellValue("客户姓名");
        titleRow.createCell(2).setCellValue("会员状态");
        titleRow.createCell(3).setCellValue("民族");
        titleRow.createCell(4).setCellValue("住址");
        titleRow.createCell(5).setCellValue("个人信仰");
        titleRow.createCell(6).setCellValue("是否企业客户");
        titleRow.createCell(7).setCellValue("行业");
        titleRow.createCell(8).setCellValue("生日");
        titleRow.createCell(9).setCellValue("微信号");
        titleRow.createCell(10).setCellValue("家庭人数");
        titleRow.createCell(11).setCellValue("介绍人");
        titleRow.createCell(12).setCellValue("性别");
        titleRow.createCell(13).setCellValue("证件类型");
        titleRow.createCell(14).setCellValue("客户电话");
        titleRow.createCell(15).setCellValue("职务");
        titleRow.createCell(16).setCellValue("年龄段");
        titleRow.createCell(17).setCellValue("qq号");
        titleRow.createCell(18).setCellValue("爱好");
        titleRow.createCell(19).setCellValue("介绍人身份");
        titleRow.createCell(20).setCellValue("证件号码");
        titleRow.createCell(21).setCellValue("客户类型");
        titleRow.createCell(22).setCellValue("工作单位");
        titleRow.createCell(23).setCellValue("电子邮件");
        titleRow.createCell(24).setCellValue("备注");
        titleRow.createCell(25).setCellValue("用户常用车辆");
        titleRow.createCell(26).setCellValue("用户所在地区");
        titleRow.createCell(27).setCellValue("用户创建时间");


        //遍历将数据放到excel列中
        for (User user : users) {
            XSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
            dataRow.createCell(0).setCellValue(user.getId() == null ? 0 : user.getId());
            dataRow.createCell(1).setCellValue(user.getName() == null ? "" : user.getName());
            dataRow.createCell(2).setCellValue(user.getVStatus() == null ? "其他" : EnumUtil.getByindex(user.getVStatus(), FlagEnum.class).getName());
            dataRow.createCell(3).setCellValue(user.getNation() == null ? "" : EnumUtil.getByindex(user.getNation(), NationEnum.class).getName());
            dataRow.createCell(4).setCellValue(user.getAddr() == null ? "" : user.getAddr());
            dataRow.createCell(5).setCellValue(user.getFaith() == null ? "" : EnumUtil.getByindex(user.getFaith(), ZjxyEnum.class).getName());
            dataRow.createCell(6).setCellValue(user.getComF() == null ? "" : EnumUtil.getByindex(user.getComF(), FlagEnum.class).getName());
            dataRow.createCell(7).setCellValue(user.getProfession() == null ? "" : EnumUtil.getByindex(user.getProfession(), IndustryEnum.class).getName());
            dataRow.createCell(8).setCellValue(user.getProfession() == null ? "" : EnumUtil.getByindex(user.getProfession(), IndustryEnum.class).getName());
            dataRow.createCell(9).setCellValue(user.getWx() == null ? "" : user.getWx());
            dataRow.createCell(10).setCellValue(user.getFamSum() == null ? 0 : user.getFamSum());
            Long parentId = user.getParentId() == null ? 0 : user.getParentId();
            users.forEach(parent -> {
                if (user.getId().equals(parentId)) {
                    dataRow.createCell(11).setCellValue(parent.getName() == null ? "其他" : user.getName());
                }
            });
            dataRow.createCell(12).setCellValue(user.getGender() == null ? "" : EnumUtil.getByindex(user.getGender(), GenderEnum.class).getName());
            dataRow.createCell(13).setCellValue(user.getIdType() == null ? "" : EnumUtil.getByindex(user.getIdType(), IdTypeEnum.class).getName());
            dataRow.createCell(14).setCellValue(user.getPhone() == null ? "" : user.getPhone());
            dataRow.createCell(15).setCellValue(user.getJob() == null ? "" : EnumUtil.getByindex(user.getJob(), IndustryEnum.class).getName());
            dataRow.createCell(16).setCellValue(user.getAgeGroup() == null ? "" : EnumUtil.getByindex(user.getAgeGroup(), AgeGroupEnum.class).getName());
            dataRow.createCell(17).setCellValue(user.getQq() == null ? "" : user.getQq());
            dataRow.createCell(18).setCellValue(user.getHobby() == null ? "" : user.getHobby());
            Integer userIdentity = user.getIdentity() == null ? 0 : user.getIdentity();
            identities.forEach(identity -> {
                if (userIdentity.equals(identity.getId())) {
                    dataRow.createCell(19).setCellValue(identity.getIdentityName() == null ? "" : identity.getIdentityName());
                }
            });
            dataRow.createCell(20).setCellValue(user.getCid() == null ? "" : user.getCid());
            dataRow.createCell(21).setCellValue(user.getPType() == null ? "" : user.getPType());
            dataRow.createCell(22).setCellValue(user.getComp() == null ? "" : user.getComp());
            dataRow.createCell(23).setCellValue(user.getMail() == null ? "" : user.getMail());
            dataRow.createCell(24).setCellValue(user.getComment() == null ? "" : user.getComment());
            dataRow.createCell(25).setCellValue(user.getCar() == null ? "" : user.getCar());
            dataRow.createCell(26).setCellValue(user.getRegion() == null ? "" : EnumUtil.getByindex(user.getRegion(), RegionEnum.class).getName());
            dataRow.createCell(27).setCellValue(user.getCreatedTime() == null ? new Date() : user.getCreatedTime());


            //由于时间数据库格式是date，所以要将时间格式进行转换
            SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
            String time = format.format(user.getCreatedTime());
            dataRow.createCell(27).setCellValue(time);
        }

        String fileName = "UserLists";
        response.reset(); // 必要地清除response中的缓存信息
//        response.setContentType(request.getServletContext().getMimeType(fileName));
        response.setContentType("application/octet-stream");
        response.setContentType("application/msexcel;charset=utf-8");
        response.setHeader("name", fileName);
        response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
        response.setHeader("Pragma", "public");
        response.setDateHeader("Expires", 0);
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Content-disposition",
                "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8") + ".xlsx");
        OutputStream outputStream = response.getOutputStream();
        wb.write(outputStream);
        outputStream.flush();
        outputStream.close();


    }

    /**
     * 用户导入
     *
     * @param file 上传的文件
     * @return
     */

    @Autowired
    private UserService userService;

    @Override
    @Transactional(rollbackFor = ServiceException.class)
    public void uploadUserExcel(MultipartFile file) {
        //上传文件校验
        if (file == null || file.isEmpty()) {
            throw new ServiceException("文件不存在！");
        }
        String fileName = file.getOriginalFilename();
        fileName = fileName.toLowerCase();                   //将所有的字符转化为小写
        int index = fileName.lastIndexOf(".");
        String fileType = fileName.substring(index);  //含头不含尾
        if (!excelSet.contains(fileType)) {
            //用户上传的不是Excel
            throw new ServiceException("上传文件格式错误");
        }
        InputStream fileIn = null;
        XSSFWorkbook workbook = null;
        //统计行数
        int column = 0;
        try {
            // 1.创建文件输入流
//            fileIn = new FileInputStream("list.xlsx");
            // 2.创建Excel工作簿对象
            fileIn = file.getInputStream();
            workbook = new XSSFWorkbook(fileIn);

            // 校验excel中的工作表是否存在
            int numberOfSheets = workbook.getNumberOfSheets();
            if (numberOfSheets <= 0) {
                throw new ServiceException("表格不存在");
            }
            // 3.获取Excel工作表对象
            XSSFSheet sheetAt = workbook.getSheetAt(0);
            List<User> users = new ArrayList<>();
            List<User> dbusers = userMapper.selectList(new QueryWrapper<User>().lambda().notIn(User::getVStatus, 3, 4));
//            List<Identity> identities = identityMapper.selectList(null);

            // 工作表中至少要有一行数据
            if (sheetAt.getLastRowNum() < 1) {
                throw new ServiceException("表中至少存在一条数据");
            }

            // 4.循环读取表格数据

            for (Row row : sheetAt) {
                column++;
                // 首行（即表头）不读取,后面可以校验表头
                if (row.getRowNum() == 0) {
                    continue;
                }
                // 一行至少有6列信息，无法解析需要跳过
                if (row.getLastCellNum() < 1) {
                    continue;
                }
                if (row.getCell(0) == null || row.getCell(0).getStringCellValue().isEmpty()) {
                    continue;
                }
                // 读取当前行中单元格数据，索引从0开始
                String name = row.getCell(0) == null ? "" : row.getCell(0).getStringCellValue();
                Integer nation = EnumUtil.getByName(row.getCell(1) == null ? "其它" : row.getCell(1).getStringCellValue(), NationEnum.class).getIndex();
                String addr = row.getCell(2) == null ? "" : row.getCell(2).getStringCellValue();
                Integer faith = EnumUtil.getByName(row.getCell(3) == null ? "其它" : row.getCell(3).getStringCellValue(), ZjxyEnum.class).getIndex();
                Integer conF = EnumUtil.getByName(row.getCell(4) == null ? "否" : row.getCell(4).getStringCellValue(), FlagEnum.class).getIndex();
                Integer profession = EnumUtil.getByName(row.getCell(5) == null ? "其它" : row.getCell(5).getStringCellValue(), IndustryEnum.class).getIndex();
                Date birth = new Date();
                Cell cell1 = row.getCell(6);
                if (row.getCell(6) != null) {
                    birth = row.getCell(6).getDateCellValue();
                }
                String wx = row.getCell(7) == null ? "" : row.getCell(7).getStringCellValue();
                Integer famSum = row.getCell(8) == null ? 0 : (int) row.getCell(8).getNumericCellValue();
                if (row.getCell(9) != null) {
                    row.getCell(9).setCellType(Cell.CELL_TYPE_STRING);
                }
                String tempPhone = row.getCell(9) == null ? "" : row.getCell(9).getStringCellValue();
                String tempName = row.getCell(10) == null ? "" : row.getCell(10).getStringCellValue();
                Long parentId[] = {0L};
                dbusers.forEach(dbuser -> {
                    if (tempPhone.equals(dbuser.getPhone())) {
                        parentId[0] = dbuser.getId();
                    }

                });
                Integer gender = EnumUtil.getByName(row.getCell(11) == null ? "其他" : row.getCell(11).getStringCellValue(), GenderEnum.class).getIndex();
                Integer idType = EnumUtil.getByName(row.getCell(12) == null ? "其它" : row.getCell(12).getStringCellValue(), IdTypeEnum.class).getIndex();
                if (row.getCell(13) != null) {
                    row.getCell(13).setCellType(Cell.CELL_TYPE_STRING);
                }
                String phone = row.getCell(13) == null ? "" : row.getCell(13).getStringCellValue();

                Integer job = EnumUtil.getByName(row.getCell(14) == null ? "其它" : row.getCell(14).getStringCellValue(), JobEnum.class).getIndex();
                Integer ageGroup = EnumUtil.getByName(row.getCell(15) == null ? "其他" : row.getCell(15).getStringCellValue(), AgeGroupEnum.class).getIndex();
                if (row.getCell(16) != null) {
                    row.getCell(16).setCellType(Cell.CELL_TYPE_STRING);
                }
                String qq = row.getCell(16) == null ? "" : row.getCell(16).getStringCellValue();
                String hobby = row.getCell(17) == null ? "" : row.getCell(17).getStringCellValue();
//                Integer  = EnumUtil.getByName(row.getCell(18) == null ? "其它" : row.getCell(18).getStringCellValue(), UserTypeEnum.class).getIndex();
//                Integer identity = row.getCell(18) == null ? 200 : (int)row.getCell(18).getNumericCellValue();
                if (row.getCell(19) != null) {
                    row.getCell(19).setCellType(Cell.CELL_TYPE_STRING);
                }
                String cid = row.getCell(19) == null ? "" : row.getCell(19).getStringCellValue();
                String pType = row.getCell(20) == null ? "" : row.getCell(20).getStringCellValue();
                String comp = row.getCell(21) == null ? "" : row.getCell(21).getStringCellValue();
                String mail = row.getCell(22) == null ? "" : row.getCell(22).getStringCellValue();
                if (row.getCell(23) != null) {
                    row.getCell(23).setCellType(Cell.CELL_TYPE_STRING);

                }
                String comment = row.getCell(23) == null ? "" : row.getCell(23).getStringCellValue();
                String car = row.getCell(24) == null ? "" : row.getCell(24).getStringCellValue();
                Integer region = EnumUtil.getByName(row.getCell(25) == null ? "其它" : row.getCell(25).getStringCellValue(), RegionEnum.class).getIndex();
                //与数据库数据做重复性验证

                User user = new User();
                user.setName(name)
                        .setVStatus(0)
                        .setNation(nation)
                        .setAddr(addr)
                        .setFaith(faith)
                        .setComF(conF)
                        .setProfession(profession)
                        .setBirth(birth)
                        .setWx(wx)
                        .setFamSum(famSum)
                        .setParentId(parentId[0])
                        .setGender(gender)
                        .setIdType(idType)
                        .setPhone(phone)
                        .setJob(job)
                        .setAgeGroup(ageGroup)
                        .setQq(qq)
                        .setHobby(hobby)
//                        .setIdentity(identity)
                        .setCid(cid)
                        .setPType(pType)
                        .setComp(comp)
                        .setMail(mail)
                        .setComment(comment)
                        .setCar(car)
                        .setRegion(region)
                        .setDeleted(0)
                        .setCreatedUser(ShiroUtils.getUsername())
                        .setUpdatedUser(ShiroUtils.getUsername())

                ;

                int finalColumn = column;
                users.forEach(userOne -> {
                    if (user.getPhone().isEmpty() || userOne.getPhone().equals(user.getPhone())) {
                        throw new ServiceException("导入失败 第" + finalColumn + "行电话号码表中有重复");
                    }
                    if (user.getCid().isEmpty() || userOne.getCid().equals(user.getCid())) {
                        throw new ServiceException("导入失败 第" + finalColumn + "行 " + user.getName() + " 证件号码表中有重复");
                    }
                });
                dbusers.forEach(dbuser -> {
                    if (dbuser.getPhone().equals(user.getPhone())) {
                        throw new ServiceException("导入失败 第" + finalColumn + "行 " + user.getName() + " 电话号码已添加过");
                    }
                    if (dbuser.getCid().equals(user.getCid())) {
                        throw new ServiceException("导入失败 第" + finalColumn + "行 " + user.getName() + " 证件号码已添加过");
                    }
                    if (!NumberUtil.isPhone(user.getPhone())) {
                        throw new ServiceException("导入失败 第" + finalColumn + "行 " + user.getName() + " 手机号码验证错误");
                    }
                    if (user.getIdType() == 1) {
                        if (cid == null || cid.isEmpty() || !IdcardUtils.validateCard(cid)) {
                            throw new ServiceException("导入失败 第" + finalColumn + "行 " + user.getName() + " (陆)证件号码不合法");
                        }
                    }
                    if (user.getIdType() == 2) {
                        if (cid == null || cid.isEmpty() || !IdcardUtils.validateHKCard(cid)) {
                            throw new ServiceException("导入失败 第" + finalColumn + "行 " + user.getName() + " (港)证件号码不合法");
                        }
                    }
                });

                users.add(user);
            }
            userService.saveBatch(users);
//            return users;

        } catch (Exception e) {
            e.printStackTrace();
            throw new ServiceException("导入失败 第" + column + "行数据有误" + e.getMessage());
        } finally {
            // 5.关闭流
            try {
                fileIn.close();
            } catch (IOException e) {
                e.printStackTrace();
                throw new ServiceException(e);
            }
        }


    }


//    @Override
//    public void getVipExcel(HttpServletResponse response) {
//        //确定编码的格式
//        response.setCharacterEncoding("UTF-8");
//        //获取导出的数据
//        List<User> users = userMapper.selectList(null);
//        List<Identity> identities = identityMapper.selectList(null);
//        List<VipUser> vipUsers = vipUserMapper.selectList(null);
//
//        //创建excel文件
//        XSSFWorkbook wb = new XSSFWorkbook();
//        //创建sheet页
//        XSSFSheet sheet = wb.createSheet("客户用户信息");
//        //创建标题行
//        XSSFRow titleRow = sheet.createRow(0);
//        titleRow.createCell(0).setCellValue("客户id");
//        titleRow.createCell(1).setCellValue("客户姓名");
//        titleRow.createCell(2).setCellValue("会员状态");
//        titleRow.createCell(3).setCellValue("民族");
//        titleRow.createCell(4).setCellValue("住址");
//        titleRow.createCell(5).setCellValue("个人信仰");
//        titleRow.createCell(6).setCellValue("是否企业客户");
//        titleRow.createCell(7).setCellValue("行业");
//        titleRow.createCell(8).setCellValue("生日");
//        titleRow.createCell(9).setCellValue("微信号");
//        titleRow.createCell(10).setCellValue("家庭人数");
//        titleRow.createCell(11).setCellValue("介绍人");
//        titleRow.createCell(12).setCellValue("性别");
//        titleRow.createCell(13).setCellValue("证件类型");
//        titleRow.createCell(14).setCellValue("客户电话");
//        titleRow.createCell(15).setCellValue("职务");
//        titleRow.createCell(16).setCellValue("年龄段");
//        titleRow.createCell(17).setCellValue("qq号");
//        titleRow.createCell(18).setCellValue("爱好");
//        titleRow.createCell(19).setCellValue("介绍人身份");
//        titleRow.createCell(20).setCellValue("证件号码");
//        titleRow.createCell(21).setCellValue("客户类型");
//        titleRow.createCell(22).setCellValue("工作单位");
//        titleRow.createCell(23).setCellValue("电子邮件");
//        titleRow.createCell(24).setCellValue("备注");
//        titleRow.createCell(25).setCellValue("用户常用车辆");
//        titleRow.createCell(26).setCellValue("用户所在地区");
//        titleRow.createCell(27).setCellValue("用户创建时间");
//        titleRow.createCell(28).setCellValue("vip卡号");
//        titleRow.createCell(29).setCellValue("vip卡名");
//        titleRow.createCell(30).setCellValue("发行时间");
//        titleRow.createCell(31).setCellValue("结束时间");
//        titleRow.createCell(32).setCellValue("会员卡状态");
//        titleRow.createCell(33).setCellValue("是否返现");
//        titleRow.createCell(34).setCellValue("是否可以转让");
//        titleRow.createCell(35).setCellValue("会员备注");
//        titleRow.createCell(36).setCellValue("会员备注");
//        titleRow.createCell(37).setCellValue("创建时间");
//        titleRow.createCell(38).setCellValue("创建时间");
//        titleRow.createCell(39).setCellValue("购买人");
//        titleRow.createCell(40).setCellValue("购买人证件类型");
//        titleRow.createCell(41).setCellValue("购买人证件号码");
//        titleRow.createCell(42).setCellValue("购买人电话");
//        titleRow.createCell(43).setCellValue("购买人性别");
//        titleRow.createCell(44).setCellValue("预留人是否接收消息");
//        titleRow.createCell(45).setCellValue("合同地址");
//
//        //遍历将数据放到excel列中
//        for (User user : users) {
//            if (user.getVStatus().equals(1)) {
//                XSSFRow dataRow = sheet.createRow(sheet.getLastRowNum() + 1);
//                dataRow.createCell(0).setCellValue(user.getId() == null ? 0 : user.getId());
//                dataRow.createCell(1).setCellValue(user.getName() == null ? "" : user.getName());
//                dataRow.createCell(2).setCellValue(user.getVStatus() == null ? "" : EnumUtil.getByindex(user.getVStatus(), FlagEnum.class).getName());
//                dataRow.createCell(3).setCellValue(user.getNation() == null ? "" : EnumUtil.getByindex(user.getNation(), NationEnum.class).getName());
//                dataRow.createCell(4).setCellValue(user.getAddr() == null ? "" : user.getAddr());
//                dataRow.createCell(5).setCellValue(user.getFaith() == null ? "" : EnumUtil.getByindex(user.getFaith(), ZjxyEnum.class).getName());
//                dataRow.createCell(6).setCellValue(user.getComF() == null ? "" : EnumUtil.getByindex(user.getComF(), FlagEnum.class).getName());
//                dataRow.createCell(7).setCellValue(user.getProfession() == null ? "" : EnumUtil.getByindex(user.getProfession(), IndustryEnum.class).getName());
//                dataRow.createCell(8).setCellValue(user.getProfession() == null ? "" : EnumUtil.getByindex(user.getProfession(), IndustryEnum.class).getName());
//                dataRow.createCell(9).setCellValue(user.getWx() == null ? "" : user.getWx());
//                dataRow.createCell(10).setCellValue(user.getFamSum() == null ? 0 : user.getFamSum());
//                Long parentId = user.getParentId() == null ? 0 : user.getParentId();
//                users.forEach(parent -> {
//                    if (user.getId().equals(parentId)) {
//                        dataRow.createCell(11).setCellValue(parent.getName() == null ? "" : user.getName());
//                    }
//                });
//                dataRow.createCell(12).setCellValue(user.getGender() == null ? "" : EnumUtil.getByindex(user.getGender(), GenderEnum.class).getName());
//                dataRow.createCell(13).setCellValue(user.getIdType() == null ? "" : EnumUtil.getByindex(user.getIdType(), IdTypeEnum.class).getName());
//                dataRow.createCell(14).setCellValue(user.getPhone() == null ? "" : user.getPhone());
//                dataRow.createCell(15).setCellValue(user.getJob() == null ? "" : EnumUtil.getByindex(user.getJob(), IndustryEnum.class).getName());
//                dataRow.createCell(16).setCellValue(user.getAgeGroup() == null ? "" : EnumUtil.getByindex(user.getAgeGroup(), AgeGroupEnum.class).getName());
//                dataRow.createCell(17).setCellValue(user.getQq() == null ? "" : user.getQq());
//                dataRow.createCell(18).setCellValue(user.getHobby() == null ? "" : user.getHobby());
//                Integer userIdentity = user.getIdentity() == null ? 0 : user.getIdentity();
//                identities.forEach(identity -> {
//                    if (userIdentity.equals(identity.getId())) {
//                        dataRow.createCell(19).setCellValue(identity.getIdentityName() == null ? "" : identity.getIdentityName());
//                    }
//                });
//                dataRow.createCell(20).setCellValue(user.getCid() == null ? "" : user.getCid());
//                dataRow.createCell(21).setCellValue(user.getPType() == null ? "" : user.getPType());
//                dataRow.createCell(22).setCellValue(user.getComp() == null ? "" : user.getComp());
//                dataRow.createCell(23).setCellValue(user.getMail() == null ? "" : user.getMail());
//                dataRow.createCell(24).setCellValue(user.getComment() == null ? "" : user.getComment());
//                dataRow.createCell(25).setCellValue(user.getCar() == null ? "" : user.getCar());
//                dataRow.createCell(26).setCellValue(user.getRegion() == null ? "" : EnumUtil.getByindex(user.getRegion(), RegionEnum.class).getName());
//                dataRow.createCell(27).setCellValue(user.getCreatedTime() == null ? new Date() : user.getCreatedTime());
//
//
//                //由于时间数据库格式是date，所以要将时间格式进行转换
//                SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日");
//                String time = format.format(user.getCreatedTime());
//                dataRow.createCell(27).setCellValue(time);
//
//
//            }
//        }
//    }


}
